home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / drivers / dlair.c < prev    next >
C/C++ Source or Header  |  2000-04-23  |  7KB  |  282 lines

  1. /* the way I hooked up the CTC is most likely completely wrong */
  2.  
  3. #include "driver.h"
  4. #include "vidhrdw/generic.h"
  5. #include "machine/z80fmly.h"
  6.  
  7.  
  8.  
  9. /*
  10.    Dragon's Lair has two 7 segment LEDs on the board, used to report error
  11.    codes.
  12.    The association between the bits of the port and the led segments is:
  13.  
  14.     ---0---
  15.    |       |
  16.    5       1
  17.    |       |
  18.     ---6---
  19.    |       |
  20.    4       2
  21.    |       |
  22.     ---3---
  23.  
  24.    bit 7 = enable (0 = display off)
  25.  
  26.    Error codes for led 0:
  27.    1 bad CPU
  28.    2 bad ROM
  29.    3 bad RAM a000-a7ff
  30.    4 bad RAM c000-c7ff
  31.    5 bad I/O ports 0-3
  32.    P ?
  33.  */
  34.  
  35. static int led0,led1;
  36.  
  37. WRITE_HANDLER( dlair_led0_w )
  38. {
  39.     led0 = data;
  40. }
  41. WRITE_HANDLER( dlair_led1_w )
  42. {
  43.     led1 = data;
  44. }
  45.  
  46. void dlair_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  47. {
  48.     int offs;
  49.  
  50.  
  51.     /* for every character in the Video RAM, check if it has been modified */
  52.     /* since last time and update it accordingly. */
  53.     for (offs = videoram_size - 2;offs >= 0;offs-=2)
  54.     {
  55.         if (dirtybuffer[offs] || dirtybuffer[offs+1])
  56.         {
  57.             int sx,sy;
  58.  
  59.  
  60.             dirtybuffer[offs] = 0;
  61.             dirtybuffer[offs+1] = 0;
  62.  
  63.             sx = (offs/2) % 32;
  64.             sy = (offs/2) / 32;
  65.  
  66.             drawgfx(tmpbitmap,Machine->gfx[0],
  67.                     videoram[offs+1],
  68.                     0,
  69.                     0,0,
  70.                     8*sx,16*sy,
  71.                     &Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  72.         }
  73.     }
  74.  
  75.  
  76.     /* copy the character mapped graphics */
  77.     copybitmap(bitmap,tmpbitmap,0,0,0,0,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  78.  
  79. if (led0 & 128)
  80. {
  81. if ((led0 & 1) == 0) drawgfx(bitmap,Machine->uifont,'x',0,0,0,
  82.     8,0,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  83. if ((led0 & 2) == 0) drawgfx(bitmap,Machine->uifont,'x',0,0,0,
  84.     16,8,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  85. if ((led0 & 4) == 0) drawgfx(bitmap,Machine->uifont,'x',0,0,0,
  86.     16,24,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  87. if ((led0 & 8) == 0) drawgfx(bitmap,Machine->uifont,'x',0,0,0,
  88.     8,32,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  89. if ((led0 & 16) == 0) drawgfx(bitmap,Machine->uifont,'x',0,0,0,
  90.     0,24,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  91. if ((led0 & 32) == 0) drawgfx(bitmap,Machine->uifont,'x',0,0,0,
  92.     0,8,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  93. if ((led0 & 64) == 0) drawgfx(bitmap,Machine->uifont,'x',0,0,0,
  94.     8,16,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  95. }
  96. if (led1 & 128)
  97. {
  98. if ((led1 & 1) == 0) drawgfx(bitmap,Machine->uifont,'x',0,0,0,
  99.     32+8,0,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  100. if ((led1 & 2) == 0) drawgfx(bitmap,Machine->uifont,'x',0,0,0,
  101.     32+16,8,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  102. if ((led1 & 4) == 0) drawgfx(bitmap,Machine->uifont,'x',0,0,0,
  103.     32+16,24,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  104. if ((led1 & 8) == 0) drawgfx(bitmap,Machine->uifont,'x',0,0,0,
  105.     32+8,32,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  106. if ((led1 & 16) == 0) drawgfx(bitmap,Machine->uifont,'x',0,0,0,
  107.     32+0,24,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  108. if ((led1 & 32) == 0) drawgfx(bitmap,Machine->uifont,'x',0,0,0,
  109.     32+0,8,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  110. if ((led1 & 64) == 0) drawgfx(bitmap,Machine->uifont,'x',0,0,0,
  111.     32+8,16,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  112. }
  113. }
  114.  
  115.  
  116.  
  117. /* z80 ctc */
  118. static void ctc_interrupt (int state)
  119. {
  120.     cpu_cause_interrupt (0, Z80_VECTOR(0,state) );
  121. }
  122.  
  123. static z80ctc_interface ctc_intf =
  124. {
  125.     1,                  /* 1 chip */
  126.     { 0 },              /* clock (filled in from the CPU 0 clock */
  127.     { 0 },              /* timer disables */
  128.     { ctc_interrupt },  /* interrupt handler */
  129.     { 0 },              /* ZC/TO0 callback */
  130.     { 0 },              /* ZC/TO1 callback */
  131.     { 0 }               /* ZC/TO2 callback */
  132. };
  133.  
  134.  
  135. void dlair_init_machine(void)
  136. {
  137.    /* initialize the CTC */
  138.    ctc_intf.baseclock[0] = Machine->drv->cpu[0].cpu_clock;
  139.    z80ctc_init(&ctc_intf);
  140. }
  141.  
  142.  
  143. static struct MemoryReadAddress readmem[] =
  144. {
  145.     { 0x0000, 0x7fff, MRA_ROM },
  146.     { 0xa000, 0xa7ff, MRA_RAM },
  147.     { 0xc000, 0xc7ff, MRA_RAM },
  148.     { -1 }    /* end of table */
  149. };
  150.  
  151. static struct MemoryWriteAddress writemem[] =
  152. {
  153.     { 0x0000, 0x7fff, MWA_ROM },
  154.     { 0xa000, 0xa7ff, MWA_RAM },
  155.     { 0xc000, 0xc3ff, videoram_w, &videoram, &videoram_size },
  156.     { 0xc400, 0xc7ff, MWA_RAM },
  157.     { 0xe000, 0xe000, dlair_led0_w },
  158.     { 0xe008, 0xe008, dlair_led1_w },
  159.     { 0xe030, 0xe030, watchdog_reset_w },
  160.     { -1 }    /* end of table */
  161. };
  162.  
  163. static unsigned char pip[4];
  164. static READ_HANDLER( pip_r )
  165. {
  166. logerror("PC %04x: read I/O port %02x\n",cpu_get_pc(),offset);
  167.     return pip[offset];
  168. }
  169. static WRITE_HANDLER( pip_w )
  170. {
  171. logerror("PC %04x: write %02x to I/O port %02x\n",cpu_get_pc(),data,offset);
  172.     pip[offset] = data;
  173. z80ctc_0_w(offset,data);
  174. }
  175.  
  176. static struct IOReadPort readport[] =
  177. {
  178.     { 0x00, 0x03, pip_r },
  179. //    { 0x80, 0x83, z80ctc_0_r },
  180.     { -1 }    /* end of table */
  181. };
  182.  
  183. static struct IOWritePort writeport[] =
  184. {
  185.     { 0x00, 0x03, pip_w },
  186. //    { 0x80, 0x83, z80ctc_0_w },
  187.     { -1 }    /* end of table */
  188. };
  189.  
  190.  
  191.  
  192. INPUT_PORTS_START( dlair )
  193.     PORT_START
  194. INPUT_PORTS_END
  195.  
  196.  
  197.  
  198. static struct GfxLayout charlayout =
  199. {
  200.     8,16,
  201.     512,
  202.     1,
  203.     { 0 },
  204.     { 7, 6, 5, 4, 3, 2, 1, 0 },
  205.     { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
  206.             8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
  207.     16*8    /* every char takes 8 consecutive bytes */
  208. };
  209.  
  210.  
  211. static struct GfxDecodeInfo gfxdecodeinfo[] =
  212. {
  213.     { REGION_GFX1, 0x0000, &charlayout,  0, 8 },
  214.     { -1 } /* end of array */
  215. };
  216.  
  217.  
  218.  
  219. static Z80_DaisyChain daisy_chain[] =
  220. {
  221.     { z80ctc_reset, z80ctc_interrupt, z80ctc_reti, 0 }, /* CTC number 0 */
  222.     { 0,0,0,-1}         /* end mark */
  223. };
  224.  
  225.  
  226.  
  227. static struct MachineDriver machine_driver_dlair =
  228. {
  229.     /* basic machine hardware */
  230.     {
  231.         {
  232.             CPU_Z80,
  233.             3072000,    /* 3.072 Mhz ? */
  234.             readmem,writemem,readport,writeport,
  235.             0,0, /* interrupts are made by z80 daisy chain system */
  236.             0,0,daisy_chain
  237.         }
  238.     },
  239.     60, DEFAULT_60HZ_VBLANK_DURATION,    /* frames per second, vblank duration */
  240.     1,    /* single CPU, no need for interleaving */
  241.     dlair_init_machine,
  242.  
  243.     /* video hardware */
  244.     32*8, 32*8, { 0*8, 32*8-1, 0*8, 32*8-1 },
  245.     gfxdecodeinfo,
  246.     8,8,
  247.     0,
  248.  
  249.     VIDEO_TYPE_RASTER|VIDEO_SUPPORTS_DIRTY,
  250.     0,
  251.     generic_vh_start,
  252.     generic_vh_stop,
  253.     dlair_vh_screenrefresh,
  254.  
  255.     /* sound hardware */
  256.     0,0,0,0,
  257. };
  258.  
  259.  
  260.  
  261. /***************************************************************************
  262.  
  263.   Game driver(s)
  264.  
  265. ***************************************************************************/
  266.  
  267. ROM_START( dlair )
  268.     ROM_REGION( 0x10000, REGION_CPU1 )    /* 64k for code */
  269.     ROM_LOAD( "u45",          0x0000, 0x2000, 0x329b354a )
  270.     ROM_LOAD( "u46",          0x2000, 0x2000, 0x8479612b )
  271.     ROM_LOAD( "u47",          0x4000, 0x2000, 0x6a66f6b4 )
  272.     ROM_LOAD( "u48",          0x6000, 0x2000, 0x36575106 )
  273.  
  274.     ROM_REGION( 0x2000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  275.     ROM_LOAD( "u33",          0x0000, 0x2000, 0xe7506d96 )
  276. ROM_END
  277.  
  278.  
  279.  
  280. GAMEX( 1983, dlair, 0, dlair, dlair, 0, ROT0, "Cinematronics", "Dragon's Lair", GAME_NOT_WORKING )
  281.  
  282.